package com.ccll.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.ArrayUtil;
import com.ccll.domain.common.ScanConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.util.CollectionUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 这个类虽然是当时在公司工作的时候抄来的，但是真的收益匪浅。
 */
@Slf4j
public class ScanUtil {
    /**
     * 根据传入的ScanConfig（扫描信息配置类）来进行文件的扫描。
     */
    public static List<File> scanFileByScanConfig(ScanConfig scanConfig) {
        List<File> files = new ArrayList<>();

        if (scanConfig == null) {
            return files;
        }
        try {
            String parentDir = scanConfig.getScanDir();
            if (parentDir.isEmpty()) {
                log.warn("scanConfig dir = " + scanConfig.getScanDir() + " 被扫描的目录为空，结束扫描");
                return files;
            }

            List<File> listOfFiles = new ArrayList<>();
            Date date = new Date();
            long lastTime = date.getTime() - 3 * 1000;

            //根据是否筛选文件格式来进行分批
            if (scanConfig.getIsScreenFormat()) {
                //进行筛选
                String screenFormat = scanConfig.getScreenFormat();
                //排除筛选格式
                if (screenFormat.isEmpty()) {
                    log.warn("scanConfig screenFormat = " + scanConfig.getScreenFormat() + "文件筛选格式为空，停止扫描");
                    return files;
                }
                // 去除后缀名中还有.的情况, 如 .txt,.doc
                screenFormat = screenFormat.replaceAll("\\.", "");
                String[] finalFormats = screenFormat.split(",");

                if (scanConfig.getIsScanChild()) {
                    //同时扫描子文件夹
                    listOfFiles = FileUtil.loopFiles(parentDir,
                            file -> !file.isDirectory()
                                    && FilenameUtils.isExtension(file.getName(), finalFormats)
                                    && file.lastModified() < lastTime);
                } else {
                    //不扫描子文件夹
                    File[] fileList = FileUtil.ls(parentDir);
                    if (ArrayUtil.isNotEmpty(fileList)) {
                        listOfFiles = Arrays.stream(fileList).filter(
                                file -> !file.isDirectory()
                                        && FilenameUtils.isExtension(file.getName(), finalFormats)
                                        && file.lastModified() < lastTime).collect(Collectors.toList());
                    }
                }

            } else {
                //不进行筛选
                if (scanConfig.getIsScanChild()) {
                    //同时扫描子文件夹
                    listOfFiles = FileUtil.loopFiles(parentDir,
                            file -> !file.isDirectory()
                                    && file.lastModified() < lastTime);
                } else {
                    //不扫描子文件夹
                    File[] fileList = FileUtil.ls(parentDir);
                    if (ArrayUtil.isNotEmpty(fileList)) {
                        listOfFiles = Arrays.stream(fileList).filter(
                                file -> !file.isDirectory()
                                        && file.lastModified() < lastTime).collect(Collectors.toList());
                    }
                }
            }
            if (CollectionUtils.isEmpty(listOfFiles)) {
                return files;
            }
            files = listOfFiles.subList(0, Math.min(listOfFiles.size(), 100));
        } catch (IORuntimeException e) {
            e.printStackTrace();
        }
        return files;
    }
}
